package IC.lir;
import IC.lir.decl.DispatchVector;
import IC.lir.decl.LabelDecl;
import IC.lir.decl.StringDecl;
import IC.lir.instructions.*;
/**
 * An instruction visitor interface
 * 
 * @param <D> propogation down type
 * @param <U> propogation up type
 */
public interface Visitor<D,U> 
{
	// decls
	public U visit(LabelDecl that, D d);
	public U visit(StringDecl that, D d);
	public U visit(DispatchVector that, D d);

	// instructions
	public U visit(ArrayLengthInstr that, D context);
	public U visit(JumpInstr that, D context);
	public U visit(LibraryInstr that, D context);
	public U visit(MoveInstr that, D context);
	public U visit(BasicInstr that, D context);
	public U visit(MoveToArrayInstr that, D context);
	public U visit(MoveFromArrayInstr that, D context);
	public U visit(MoveToFieldInstr that, D context);
	public U visit(MoveFromFieldInstr that, D context);
	public U visit(ReturnInstr that, D context);
	public U visit(StaticCallInstr that, D context);
	public U visit(VirtualCallInstr that, D context);
}
